package com.gxa.community.core.utils;

import com.aventrix.jnanoid.jnanoid.NanoIdUtils;

import java.security.SecureRandom;

public class LittleUtils {

    public final static long SECOND = 1000L;
    public final static long MINUTE = 1000L * 60;
    public final static long HOUR = 1000L * 60 * 60;
    public final static long DAY = 1000L * 60 * 60 * 24;

    /**
     * 根据当前时间戳生成13位以上的数字编号
     *
     * @param len 总位数
     * @return len位数字字符串
     */
    public static String generateNo(int len) {
        if (len < 13) throw new RuntimeException("生成的随机编号位数必须大于13");
        return generateNo(len, System.currentTimeMillis());
    }

    /**
     * 根据当前时间戳生成数字编号
     *
     * @param len       总位数
     * @param timestamp 时间戳
     * @return len位数字字符串
     */
    public static String generateNo(int len, Long timestamp) {
        return timestamp + NanoIdUtils.randomNanoId(new SecureRandom(), "0123456789".toCharArray(), len - timestamp.toString().length());
    }

    /**
     * 校验数字是否不在规定范围内
     * 为 null 时返回 false
     *
     * @param num 待比较数字
     * @param l   左范围
     * @param r   右范围
     * @return 是否不为 null 且不在范围内
     */
    public static boolean checkNum(Integer num, long l, long r) {
        if (num == null) return false;
        return num < l || num > r;
    }

    /**
     * 校验数字是否不在规定范围内
     * 为 null 时返回 b
     *
     * @param num 待比较数字
     * @param l   左范围
     * @param r   右范围
     * @return 是否不不在范围内
     */
    public static boolean checkNum(Integer num, long l, long r, boolean b) {
        if (num == null) return b;
        return num < l || num > r;
    }

    /**
     * 校验数字是否不在规定范围内
     * 为 null 时返回 false
     *
     * @param num 待比较数字
     * @param l   左范围
     * @param r   右范围
     * @return 是否不为 null 且不在范围内
     */
    public static boolean checkNum(Long num, long l, long r) {
        if (num == null) return false;
        return num < l || num > r;
    }

    /**
     * 校验数字是否不在规定范围内
     * 为 null 时返回 b
     *
     * @param num 待比较数字
     * @param l   左范围
     * @param r   右范围
     * @return 是否不不在范围内
     */
    public static boolean checkNum(Long num, long l, long r, boolean b) {
        if (num == null) return b;
        return num < l || num > r;
    }

    /**
     * @param start 开始时间
     * @param end   结束时间
     * @param n     允许的时间差值
     * @return -1时间范围符合条件 0开始或时间为null 1开始时间大于结束时间 2时间差值大于给定值
     */
    public static int checkStartEndTime(Long start, Long end, Long n) {
        if (start == null || end == null) return 0;
        if (start > end) return 1;
        else if (end - start > n) return 2;
        return -1;
    }

    /**
     * @param start 开始时间
     * @param end   结束时间
     * @return -1时间范围符合条件 0开始或时间为null 1开始时间大于结束时间 2时间差值大于60天
     */
    public static int checkStartEndTime(Long start, Long end) {
        if (start == null || end == null) return 0;
        if (start > end) return 1;
        else if (end - start > DAY * 30 * 2) return 2;
        return -1;
    }

}
